《深入理解Java虚拟机》笔记-垃圾收集器-G1

G1收集器(Garbage-First)

面向服务器

特点:

并发;不需要配合其它收集器,能够独立管理整个GC堆;整体上采用标记-整理,局部采用复制算法,运行期间不会产生内存碎片;可预测的停顿,可预测的停顿时间模型,使用者可以指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

内存布局和其他收集器有较大差别:将整个Java堆划分为多个大小相等的独立区域(Region)新生代和老年代不再是物理隔离,它们都是一些Region的集合。

为了避免Java堆中全区域的垃圾收集,G1跟踪各个堆里面的垃圾堆积的价值大小,价值通过回收所获得的空间大小和回收所需的时间的经验值来衡量。维护一个Region的优先列表,每次根据允许的收集时间,优先回收价值最大的Region。保证在有限时间内可以获取尽可能高的收集效率。

在做对象可达性判定对象存活时,不同Region之间的对象可能存在引用关系,就像其他收集器中新生代和老年代之间的对象存在引用一样。虚拟机通过Remembered Set对象来避免全堆扫描。每个Region都有一个与之对应的Remembered Set,用来记录其中对象的引用。在进行内存回收时,在GC Roots中的枚举范围中加入Remembered Set就可以保证不用全堆扫描也不会有遗漏。

在不考虑维护Remembered Set操作的情况下,G1收集器的运作大致分为4步:

初始标记;

需要停顿线程,仅标记GC Roots能直接的关联到的对象,标记TAMS,指明下一阶段用户程序创建对象的Region。

并发标记;

从GC Roots开始对堆中对象进行可达性分析,可与用户线程并发执行。

最终标记;

需要停顿线程。修改那些在并发标记阶段由于用户线程继续运行而导致标记产生变动的那一部分标记记录。虚拟机把它们记录在Remembered Set Logs中,最终标记阶段的任务就是把Remembered Set Logs中的内容合并到Remembered Set中。

筛选回收;

首先根据各个Region的回收价值和成本排序,按照用户期望的GC停顿时间来指定回收计划。可停顿也可与用户线程并发。


G1收集器运行示意图





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值